/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;

import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.primefaces.event.FileUploadEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.util.StringUtils;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKConstantes;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaDeposito;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioArchivos;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioBanco;
import pe.com.cotelasa.scp.dominio.service.IServicioCuentaBancaria;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaDeposito;
import pe.com.cotelasa.scp.entidad.Banco;
import pe.com.cotelasa.scp.entidad.CuentaBancaria;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.VentaDeposito;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author Jorge
 */
@Named(value = "MBVentaDeposito")
@Scope("request")
public class MBVentaDeposito extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBVentaDeposito.class);
    @Inject
    private BKVentaDeposito bkVentaDeposito;
    @Inject
    private BKConstantes bkConstante;
    @Inject
    private IServicioBanco servicioBanco;
    @Inject
    private IServicioEmpresa servicioEmpresa;
    @Inject
    private IServicioCuentaBancaria servicioCuentaBancaria;
    @Inject
    private IServicioVentaDeposito servicioVentaDeposito;
    @Autowired
    BKSession session;

    @Override
    public String actualizar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String guardar() {
        String ext = "";
        if (bkVentaDeposito.getImagenDetalle() != null) {
            String[] imagen = StringUtils.split(bkVentaDeposito.getImagenDetalle().getFileName(), ".");
            String nombre = UtilitarioCadenas.generateAuthCode();
            ext = imagen[imagen.length - 1];
            bkVentaDeposito.getVentaDepositoFormulario().setDocsustento(nombre + "." + ext);
            try {
                UtilitarioArchivos.guardarImagenServer(bkVentaDeposito.getImagenDetalle(), serviceProperties.getProperty("path.server.documento.deposito")
                        + nombre + "." + ext);
            } catch (Exception e) {
                mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
            }
        } else {
            bkVentaDeposito.getVentaDepositoFormulario().setDocsustento(null);
        }


        try {
            bkVentaDeposito.getVentaDepositoFormulario().setFecCreacion(new Date());
            bkVentaDeposito.getVentaDepositoFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bkVentaDeposito.getVentaDepositoFormulario().setCuenta(servicioCuentaBancaria.conseguirCuentaBancariaPorId(bkVentaDeposito.getIdCuentaBancaria()));
            servicioVentaDeposito.guardarVentaDeposito(bkVentaDeposito.getVentaDepositoFormulario());
            
            mostrarMensaje("Se guardo el depósito satisfactoriamente.");
            buscarListaDepositos();
            return URLPaginacion.Ventas.URL_LISTA_DEPOSITO;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_DEPOSITO;
        }

    }

    @Override
    public void eliminar(ActionEvent actionEvent) {

        bkVentaDeposito.getVentaDepositoSeleccionado().setUsrModificacion(session.getUsuario().getUsuario());
        bkVentaDeposito.getVentaDepositoSeleccionado().setFecModificacion(new Date());
        bkVentaDeposito.getVentaDepositoSeleccionado().setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        //logger.info("Eliminar cliente : " + bkCliente.getClienteSeleccionado());
        try {
            servicioVentaDeposito.actualizarVentaDeposito(bkVentaDeposito.getVentaDepositoSeleccionado());
            buscarListaDepositos();
            mostrarMensaje("Se elimino el deposito satisfactoriamente");
        } catch (ServiceException ex) {
            ex.printStackTrace();
            logger.error(ex.getMessage(), ex);
            mostrarError("Ocurrio un problema al elminar el cliente");
        }
    }

    @Override
    public String editar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String nuevo() {

        bkVentaDeposito.setComando(new ComandoGuardar(this));
        try {
            //cargar correlativo


            VentaDeposito deposito = new VentaDeposito();
            deposito.setFecha(new Date());
            deposito.setMonto(0.0);
            bkVentaDeposito.setIdBanco(Integer.MIN_VALUE);
            bkVentaDeposito.setVentaDepositoFormulario(deposito);
            bkVentaDeposito.setListaBanco(new ArrayList<Banco>(servicioBanco.listarBancosActivos()));
            //bkVentaDeposito.setListaEmpresa(new ArrayList<Empresa>(servicioEmpresa.listarEmpresasActivas()));
            bkVentaDeposito.setIdEmpresa(session.getEmpresa());
            //bkVentaDeposito.setListaCuenta((List<CuentaBancaria>)session.getEmpresa().getCuentaBancariaCollection());
            bkVentaDeposito.getListaCuenta().clear();
            bkVentaDeposito.getListaBanco().clear();
            boolean encontro;
            for (CuentaBancaria cuenta : session.getEmpresa().getCuentaBancariaCollection()) {
                //System.out.println("resultado: "+bkVentaDeposito.getListaBanco().contains(cuenta.getIdBanco()));
                if (cuenta.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    encontro = false;
                    for(Banco banco:bkVentaDeposito.getListaBanco()){
                        if(banco.getId().equals(cuenta.getIdBanco().getId())){
                            encontro = true;
                            break;
                        }
                    }
                    
                    if(!encontro){
                        bkVentaDeposito.getListaBanco().add(cuenta.getIdBanco());
                    }
                }
            }

            if (bkVentaDeposito.getListaBanco().isEmpty()) {
                mostrarError("No existe cuentas bancarias registradas en esta empresa");
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_DEPOSITO;
        }
        return URLPaginacion.Ventas.URL_FORMULARIO_DEPOSITO;

    }

    @Override
    public String ver() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actualizarObservador(Object object) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String mostrar() {
        try {
            VentaDeposito deposito = new VentaDeposito();
            deposito.setCuenta(new CuentaBancaria(0));
            deposito.setNumdocumento("");
            bkVentaDeposito.setVentaDepositoBusqueda(deposito);
            //bkVentaDeposito.setListaBanco(new ArrayList<Banco>(servicioBanco.listarBancosActivos()));
            bkVentaDeposito.getListaCuentaBus().clear();
            session.setEmpresa(servicioEmpresa.conseguirEmpresaPorId(session.getEmpresa().getId()));
            for(CuentaBancaria cuenta:session.getEmpresa().getCuentaBancariaCollection()){
                if(cuenta.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()){
                    bkVentaDeposito.getListaCuentaBus().add(cuenta);
                }
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.Ventas.URL_LISTA_DEPOSITO;
    }

    public void cargarCuentas() {

        //System.out.println(bkVentaDeposito.getIdEmpresa()+" -- "+bkVentaDeposito.getIdBanco());
        bkVentaDeposito.getListaCuenta().clear();
        for (CuentaBancaria cuenta : session.getEmpresa().getCuentaBancariaCollection()) {
            if (cuenta.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor() && cuenta.getIdBanco().getId().intValue() == bkVentaDeposito.getIdBanco()) {
                bkVentaDeposito.getListaCuenta().add(cuenta);
            }
        }

        /*try {
         bkVentaDeposito.setListaCuenta(new ArrayList<CuentaBancaria>(servicioCuentaBancaria.listarCuentaBancariasPorEmpresa(bkVentaDeposito.getIdEmpresa(),bkVentaDeposito.getIdBanco())));
         } catch (ServiceException e) {
         mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
         logger.error(e.getMessage(), e);
         }*/
    }

    public void handleFileUpload(FileUploadEvent event) {
        bkVentaDeposito.setImagenDetalle(event.getFile());
        FacesMessage msg = new FacesMessage("Se subió la foto satisfactoriamente", event.getFile().getFileName());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void buscarListaDepositos() {
        try {
            bkVentaDeposito.setListaDepositos(servicioVentaDeposito.buscarPorFiltro(bkVentaDeposito.getVentaDepositoBusqueda(),bkVentaDeposito.getBusquedaDel(),bkVentaDeposito.getBusquedaAl()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }
    
    public void marcarInicioOC(DateSelectEvent event) {
        bkVentaDeposito.setBusquedaDel(event.getDate());
    }

    public void marcarFinalOC(DateSelectEvent event) {
        bkVentaDeposito.setBusquedaAl(event.getDate());
    }
}
